package com.naiterui.ehp.bp.utils.qr;

import org.apache.commons.codec.binary.Base64;

import com.naiterui.ehp.bp.utils.encypt.MD5;

public class WeiXinEncrypUtil {

    // 基础数据种子
    public static String[] arr = "A,f,q,D,d,F,G,w,I,x".split(",");

    /**
     * <url加密生成>
     *
     * @return String <返回值描述>
     * 加密之后，m值为密文的id和type，k为id和type加密值，进行校验使用
     *
     * @Throws 异常信息
     * @History 2015年7月5日 下午11:11:49 by chenlin
     */
    public static String encryUrl(String baseUrl, Long id, Integer type) {

        // 根据id根据索引转化为字符值
        char[] ch = String.valueOf(id).toCharArray();
        StringBuilder result = new StringBuilder();
        for (char c : ch) {
            int index = Integer.parseInt(c + "");
            result.append(arr[index]);
        }
        // 将id转化为字符串
        // System.out.println(result);

        // 对转后的id和类型type进行base64处理
        String encode = Base64.encodeBase64String((result + "type=" + type).getBytes());
        result = new StringBuilder(encode);
        // System.out.println(result);
        // 拼接url，并对原id和type进行md5，便于解密后校验
        String url = baseUrl + "?m=" + result + "&k=";
        result = new StringBuilder(url + MD5.md5(id + "-" + type));
        return result.toString();
    }


    /**
     * <解密生成>
     *
     * @param m 解密m,转化为推广者id和推广类型
     *
     * @return String <id:type>
     *
     * @Throws 异常信息
     * @History 2015年7月5日 下午11:11:49 by chenlin
     */
    public static String decryUrl(String m) {

        // 解密出id和类型值
        byte[] r = Base64.decodeBase64(m.getBytes());
        String[] idType = new String(r).split("type=");

        // 寻找GDM在数组下标
        char[] idArr = idType[0].toCharArray();
        String id = "";
        for (char anIdArr : idArr) {
            String c = anIdArr + "";
            for (int j = 0; j < arr.length; j++) {
                if (c.equals(arr[j])) {
                    id += j;
                    break;
                }
            }
        }
        String type = idType[1];
        return id + ":" + type;
    }

    /**
     * <验证推广和md5传递的值是否相同>
     *
     * @return boolean <返回值描述>
     *
     * @Throws 异常信息
     * @History 2015年7月6日 上午2:25:00 by chenlin
     */
    public static boolean md5Valid(String m, String k) {
        String idType = decryUrl(m);
        String[] idTypeArr = idType.split(":");
        String rsMd5 = MD5.md5(idTypeArr[0] + "-" + idTypeArr[1]);
        if (k.equals(rsMd5)) {
            return true;
        }
        return false;
    }
}
